﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.SqlClient;
using System.Data;

namespace DataAccess
{
    public class ControllerAdministrador
    {
        #region ATRIBUTOS

        private SqlConnection conexion =  DBConnection.getInstancia().getConnection();
        private static ControllerAdministrador unConAdmin;

        #endregion
        
        #region SINGLETON

        public static ControllerAdministrador getInstancia()
        {
            if(unConAdmin == null)
            {
                unConAdmin = new ControllerAdministrador();
            }
            return unConAdmin;
        }

        #endregion

        #region CONSTRUCTORES

        private ControllerAdministrador()
        {}

        #endregion

        #region METODOS

        //Alta de nuevo Administrador.
        public void insertAdministrador(Int32 pNro, string pNom, string pAp, string pTel, string pInt, string pMail, string pSec)
        {
            try
            {
                //Abrimos la conexion. 
                conexion.Open();
                //Declaramos la transaccion.
                SqlTransaction myTrans = conexion.BeginTransaction(IsolationLevel.Serializable);
                //Creamos el comando.
                SqlCommand myComm = conexion.CreateCommand();
                //Le asignamos la transaccion a la propiedad Transaction del comando creado.
                myComm.Transaction = myTrans;
                try
                {
                    //Insertamos en la tabla "personas".
                    myComm.CommandText = "INSERT INTO personas(pernrofuncionario, pernombre, perapellido, pertelefono, perinterno, permail, perseccion) VALUES (@pNro, @pNom, @pAp, @pTel, @pInt, @pMail, @pSec);";
                    myComm.Parameters.AddWithValue("pNro", pNro);
                    myComm.Parameters.AddWithValue("pNom", truncar(pNom, 29));
                    myComm.Parameters.AddWithValue("pAp", truncar(pAp, 29));
                    myComm.Parameters.AddWithValue("pTel", truncar(pTel, 29));
                    myComm.Parameters.AddWithValue("pInt", truncar(pInt, 19));
                    myComm.Parameters.AddWithValue("pMail", truncar(pMail, 49));
                    myComm.Parameters.AddWithValue("pSec", truncar(pSec, 49));

                    //Ejecutamos el comando.
                    myComm.ExecuteNonQuery();
                    //Insertamos en la tabla administradores.
                    myComm.CommandText = "INSERT INTO administradores(admnrofuncionario) VALUES (@pNroAdm);";
                    myComm.Parameters.AddWithValue("pNroAdm", pNro);
                    //Ejecutamos el comando.
                    myComm.ExecuteNonQuery();
                    //Hacemos el commit.
                    myTrans.Commit();
                }
                catch (SqlException e)
                {
                    try
                    {
                        //Hacemos el rollback.
                        myTrans.Rollback();

                    }
                    catch (SqlException ex)
                    {
                        throw ex;
                    }
                }

            }
            catch (SqlException ex)
            {
                throw ex;
            }
            finally
            {
                //Cerramos la conexion.
                conexion.Close();
            }
        }

        //Dar Administrador por Nro. de funcionario.
        public DataTable getAdministradorByNro(Int32 pNro)
        {
            return ControllerPersona.getInstancia().getFuncionarioByNro(pNro, "administradores", "admnrofuncionario");
        }

        //Dar Administrador por Nombre de funcionario.
        public DataTable getAdministradorByName(string pNom, string pAp)
        {
            return ControllerPersona.getInstancia().getFuncionarioByName(pNom, pAp, "administradores", "admnrofuncionario");
        }

        //Dar Administradores por estado.
        public DataTable getAdministradoresByEstado(bool pEstado)
        {
            return ControllerPersona.getInstancia().getFuncionariosActivos(pEstado, "admnrofuncionario", "administradores");
        }
        string truncar(string unSt, int maxLength)
        {
            return unSt.Length <= maxLength ? unSt : unSt.Substring(0, maxLength);
        } 
        #endregion
    }
}
